﻿using System;

namespace Levfier.Proccessors.ArithmeticLogicUnits
{
    /// <summary>
    /// 加算プロセッサ
    /// </summary>
    public class Adder : Proccessor
    {
        /// <summary>
        /// 上流チェインから呼び出された回数
        /// </summary>
        private int callNum;

        /// <summary>
        /// 加算処理を行う
        /// </summary>
        /// <param name="input">入力</param>
        public override void Proccess(double[] input)
        {
            //後段のストリームが無い場合、処理しない
            if (null == this.lowerChain)
            {
                return;
            }

            //処理する
            this.InnerProccess(input, this.lowerChain.GetBuffer());

            //全ての接続されている上流チェインから呼び出されたら
            if (this.callNum >= this.upperConnectNum)
            {
                this.callNum = 0;

                //後段のストリームへ流す
                lowerChain.FlowSounds();
            }
            else
            {
                return;
            }
        }

        /// <summary>
        /// 処理
        /// </summary>
        /// <param name="inputBuffer">入力バッファ</param>
        /// <param name="outputBuffer">出力バッファ</param>
        protected override void InnerProccess(double[] inputBuffer, double[] outputBuffer)
        {
            
            if (0 >= callNum)
            {
                //初回呼び出し時はコピーするのみ
                for (int i = 0; i < inputBuffer.Length; i++)
                {
                    outputBuffer[i] = inputBuffer[i];
                }
            }
            else
            {
                //２回目移行の呼び出し時は加算する
                for (int i = 0; i < inputBuffer.Length; i++)
                {
                    outputBuffer[i] += inputBuffer[i];
                }
            }
            callNum++;
        }

        /// <summary>
        /// パラメータは無しなので何もしない
        /// </summary>
        protected override void InitParameters()
        {
        }
    }
}
